package ucla.encuestaMatic.vista.ventanas;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import com.obelisco.exception.ObeliscoException;
import com.obelisco.vista.componentes.ComponenteTransaccionDatosListener;
import com.obelisco.vista.componentes.TipoFuncion;
import com.obelisco.vista.controles.Grid;
import com.obelisco.vista.controles.Label;
import com.obelisco.vista.controles.RadioButton;
import com.obelisco.vista.controles.SelectField;
import com.obelisco.vista.controles.TextArea;

import nextapp.echo2.app.CheckBox;
import nextapp.echo2.app.Color;
import nextapp.echo2.app.Column;
import nextapp.echo2.app.ContentPane;
import nextapp.echo2.app.Extent;
import nextapp.echo2.app.Font;
import nextapp.echo2.app.Insets;
import nextapp.echo2.app.Row;
import nextapp.echo2.app.button.ButtonGroup;
import nextapp.echo2.app.button.ToggleButton;
import nextapp.echo2.app.event.ActionListener;
import nextapp.echo2.app.layout.GridLayoutData;
import nextapp.echo2.app.layout.RowLayoutData;
import nextapp.echo2.extras.app.layout.TabPaneLayoutData;
import ucla.encuestaMatic.controlador.interfaces.IServicioAdministracionAplicacionEncuesta;
import ucla.encuestaMatic.modelo.beans.Numeros;
import ucla.encuestaMatic.modelo.beans.RespuestaCerrada;
import ucla.encuestaMatic.modelo.beans.TipoRespuesta;
import ucla.encuestaMatic.modelo.data.Encuesta;
import ucla.encuestaMatic.modelo.data.EncuestaPersona;
import ucla.encuestaMatic.modelo.data.EncuestaPreguntaPersona;
import ucla.encuestaMatic.modelo.data.OpcionPregunta;
import ucla.encuestaMatic.modelo.data.Persona;
import ucla.encuestaMatic.modelo.data.Pregunta;
import ucla.encuestaMatic.modelo.data.pk.EncuestaPersonaId;

public class PaneAplicacionEncuesta extends ContentPane implements ComponenteTransaccionDatosListener {

	private Encuesta encuesta;
	private IServicioAdministracionAplicacionEncuesta servicioAdministracionAplicacionEncuesta;

	private Map<Pregunta, Object> widgetsRespuestas = new LinkedHashMap<Pregunta, Object>();
	
	public Object onBuscarObjetoEntidad() {
		// TODO Auto-generated method stub
		return null;
	}

	public void onCancelar() {
		// TODO Auto-generated method stub
		
	}

	public void onConfirmarCambios(Object objeto, TipoFuncion tipo, String nombre) {
		// TODO Auto-generated method stub
		// Guardamos la encuesta relacionada con la persona
		EncuestaPersona encuestaPersona = new EncuestaPersona();
		EncuestaPersona encuestaPersonaAux = new EncuestaPersona();
		Persona persona = this.servicioAdministracionAplicacionEncuesta.buscarPersonaEncuestada();
		encuestaPersona.setId(new EncuestaPersonaId(this.encuesta, persona));
		this.servicioAdministracionAplicacionEncuesta.guardarEncuestaPersona(encuestaPersona);
		
		// Guardamos las respuestas de la encuesta relacionada con la persona
		List encuestaPreguntasPersona = new ArrayList();		
		for (Iterator iter=widgetsRespuestas.keySet().iterator(); iter.hasNext(); ) {
			Pregunta pregunta = (Pregunta)iter.next();			
			if (pregunta.getTipoRespuesta().equals(TipoRespuesta.SELECCION_SIMPLE)) {
				Map<OpcionPregunta, RadioButton> opcionesPregunta = (Map)this.widgetsRespuestas.get(pregunta);
				for (Iterator iter2=opcionesPregunta.keySet().iterator(); iter2.hasNext(); ) {
					OpcionPregunta opcionPregunta = (OpcionPregunta)iter2.next();
					RadioButton radioButton = opcionesPregunta.get(opcionPregunta);
					if (radioButton.isSelected()) {
						EncuestaPreguntaPersona encuestaPreguntaPersona = new EncuestaPreguntaPersona();
						encuestaPreguntaPersona.setEncuesta(this.encuesta);
						encuestaPreguntaPersona.setPregunta(pregunta);
						encuestaPreguntaPersona.setOpcionPregunta(opcionPregunta);
						encuestaPreguntaPersona.setRespuesta(radioButton.getText());
						if (this.encuesta.getAnonima().equals(RespuestaCerrada.NO)) {
							encuestaPreguntaPersona.setPersona(persona);
						}						
						encuestaPreguntasPersona.add(encuestaPreguntaPersona);
					}
				}
			}
			else if (pregunta.getTipoRespuesta().equals(TipoRespuesta.SELECCION_MULTIPLE)) {
				Map<OpcionPregunta, CheckBox> opcionesPregunta = (Map)this.widgetsRespuestas.get(pregunta);
				for (Iterator iter2=opcionesPregunta.keySet().iterator(); iter2.hasNext(); ) {
					OpcionPregunta opcionPregunta = (OpcionPregunta)iter2.next();
					CheckBox checkBox = opcionesPregunta.get(opcionPregunta);
					if (checkBox.isSelected()) {
						EncuestaPreguntaPersona encuestaPreguntaPersona = new EncuestaPreguntaPersona();
						encuestaPreguntaPersona.setEncuesta(this.encuesta);
						encuestaPreguntaPersona.setPregunta(pregunta);
						encuestaPreguntaPersona.setOpcionPregunta(opcionPregunta);
						encuestaPreguntaPersona.setRespuesta(checkBox.getText());
						if (this.encuesta.getAnonima().equals(RespuestaCerrada.NO)) {
							encuestaPreguntaPersona.setPersona(persona);
						}
						encuestaPreguntasPersona.add(encuestaPreguntaPersona);
					}
				}
			}
			else if (pregunta.getTipoRespuesta().equals(TipoRespuesta.NUMERICA)) {
				EncuestaPreguntaPersona encuestaPreguntaPersona = new EncuestaPreguntaPersona();
				encuestaPreguntaPersona.setEncuesta(this.encuesta);
				encuestaPreguntaPersona.setPregunta(pregunta);
				SelectField selectField = (SelectField)this.widgetsRespuestas.get(pregunta);
				encuestaPreguntaPersona.setRespuesta(((Numeros)selectField.getSelectedItem()).getNombre());
				if (this.encuesta.getAnonima().equals(RespuestaCerrada.NO)) {
					encuestaPreguntaPersona.setPersona(persona);
				}
				encuestaPreguntasPersona.add(encuestaPreguntaPersona);
			}
			else if (pregunta.getTipoRespuesta().equals(TipoRespuesta.ALFANUMERICA)) {
				EncuestaPreguntaPersona encuestaPreguntaPersona = new EncuestaPreguntaPersona();
				encuestaPreguntaPersona.setEncuesta(this.encuesta);
				encuestaPreguntaPersona.setPregunta(pregunta);
				TextArea textArea = (TextArea)this.widgetsRespuestas.get(pregunta);
				encuestaPreguntaPersona.setRespuesta(textArea.getText());
				if (this.encuesta.getAnonima().equals(RespuestaCerrada.NO)) {
					encuestaPreguntaPersona.setPersona(persona);
				}
				encuestaPreguntasPersona.add(encuestaPreguntaPersona);
			}
		}
		for (Iterator iter3=encuestaPreguntasPersona.iterator(); iter3.hasNext(); ) {
			EncuestaPreguntaPersona encuestaPreguntaPersona = (EncuestaPreguntaPersona)iter3.next();
			this.servicioAdministracionAplicacionEncuesta.guardarEncuestaPreguntaPersona(encuestaPreguntaPersona);
		}				
	}

	public void onConfirmarEliminacion(Object object) {
		// TODO Auto-generated method stub
		
	}

	public void onConsultar(Object objeto) {
		// TODO Auto-generated method stub
		
	}

	public void onCrear() {
		// TODO Auto-generated method stub
		
	}

	public void onFuncionPersonalizada(Object objeto, TipoFuncion funcion, String nombre) {
		// TODO Auto-generated method stub
		
	}

	public void onIncluir(Object objeto) {
		// TODO Auto-generated method stub
		
	}

	private void seleccionCheckBox(Integer idPregunta, CheckBox checkBoxUsado) {
		for (Iterator iter=this.widgetsRespuestas.keySet().iterator(); iter.hasNext(); ) {
			Pregunta pregunta = (Pregunta)iter.next();
			if (pregunta.getIdPregunta().equals(idPregunta)) {
				Map<OpcionPregunta, CheckBox> checkBoxesPregunta = (Map<OpcionPregunta, CheckBox>)this.widgetsRespuestas.get(pregunta);
				OpcionPregunta opcionPregunta = null;
				for (Iterator iter2=checkBoxesPregunta.keySet().iterator(); iter2.hasNext(); ) {
					opcionPregunta = (OpcionPregunta)iter2.next();
					CheckBox checkBox = checkBoxesPregunta.get(opcionPregunta);
					if (checkBox.equals(checkBoxUsado)) {
						break;
					}
				}
				for (Iterator iter3=checkBoxesPregunta.keySet().iterator(); iter3.hasNext(); ) {
					OpcionPregunta opcionPreguntaAuxiliar = (OpcionPregunta)iter3.next();
					if (!opcionPreguntaAuxiliar.equals(opcionPregunta)) {
						CheckBox checkBox = checkBoxesPregunta.get(opcionPreguntaAuxiliar);
						if (opcionPregunta.getExcluyente().equals(RespuestaCerrada.SI)) {
							checkBox.setSelected(false);
						}
						else if ((opcionPregunta.getExcluyente().equals(RespuestaCerrada.NO)) &&
								 (opcionPreguntaAuxiliar.getExcluyente().equals(RespuestaCerrada.SI))) {
							checkBox.setSelected(false);
						}
					}					
				}
				break;
			}
		}
	}
	
	private ActionListener checkBoxListener = new ActionListener() {
		public void actionPerformed(nextapp.echo2.app.event.ActionEvent arg0) {
			Integer idPregunta = Integer.parseInt(arg0.getActionCommand());
			CheckBox checkBox = (CheckBox)arg0.getSource();
			seleccionCheckBox(idPregunta, checkBox);			
		}
	};
	
	private void initComponents() {
		this.removeAll();
		
		Grid grid = new Grid();			
		grid.setStyleName("Obelisco.GridPaneDialogo");
		grid.setSize(1);
		
		List<Pregunta> preguntas = this.servicioAdministracionAplicacionEncuesta.buscarPreguntasPorEncuesta(this.encuesta);
		for (Pregunta pregunta : preguntas) {
			Label lblPregunta = new Label (pregunta.getNumero()+". "+pregunta.getEnunciado());
			if (pregunta.getRespuestaObligatoria().equals(RespuestaCerrada.SI)) {
				lblPregunta.setText(lblPregunta.getText()+" *");
				Font boldFont = new Font(null, Font.BOLD+Font.ITALIC, new Extent(10, Extent.PT));
				lblPregunta.setFont(boldFont);
			}
			GridLayoutData gridLayout1por2 = new GridLayoutData();
			gridLayout1por2.setBackground(new Color(215,230,255));			
			lblPregunta.setLayoutData(gridLayout1por2);		
			grid.add(lblPregunta);
			
			if (pregunta.getTipoRespuesta().equals(TipoRespuesta.ALFANUMERICA)) {
				TextArea txtRespuesta = new TextArea(600, 50);
				txtRespuesta.setMaximumLength(250);
				grid.add(txtRespuesta);
				this.widgetsRespuestas.put(pregunta, txtRespuesta);
			}
			else if (pregunta.getTipoRespuesta().equals(TipoRespuesta.NUMERICA)) {
				SelectField cmbRespuesta = new SelectField(150);
				cmbRespuesta.setItemDefectoActivado(pregunta.getRespuestaObligatoria().equals(RespuestaCerrada.NO));
				List opcionesNumeros = Numeros.getNumeros(pregunta.getValorMinimoRespuesta().intValue(), pregunta.getValorMaximoRespuesta().intValue());
				cmbRespuesta.inicializarDatos(opcionesNumeros, "nombre", "id");				
				grid.add(cmbRespuesta);
				
				this.widgetsRespuestas.put(pregunta, cmbRespuesta);
			}
			else if (pregunta.getTipoRespuesta().equals(TipoRespuesta.SELECCION_SIMPLE)) {
				Map<OpcionPregunta, RadioButton> radioButtonsPregunta = new HashMap<OpcionPregunta, RadioButton>();
				ButtonGroup buttonGroup = new ButtonGroup();
				Row fila = new Row();
				for (Iterator iter2=pregunta.getOpcionPreguntas().iterator(); iter2.hasNext(); ) {
					OpcionPregunta opcionPregunta = (OpcionPregunta)iter2.next();					
					RadioButton radioButton = new RadioButton(opcionPregunta.getEnunciado(), buttonGroup, false);
					RowLayoutData rowLayoutData = new RowLayoutData();
					rowLayoutData.setInsets(new Insets(new Extent(5,Extent.PX), 
													   new Extent(0, Extent.PX), 
													   new Extent(5, Extent.PX),
													   new Extent(0, Extent.PX)));
					radioButton.setLayoutData(rowLayoutData);
					fila.add(radioButton);
					grid.add(fila);
					radioButtonsPregunta.put(opcionPregunta, radioButton);
				}
				this.widgetsRespuestas.put(pregunta, radioButtonsPregunta);
			}
			else if (pregunta.getTipoRespuesta().equals(TipoRespuesta.SELECCION_MULTIPLE)) {
				Map<OpcionPregunta, CheckBox> checkBoxesPregunta = new HashMap<OpcionPregunta, CheckBox>();
				Row fila = new Row();
				for (Iterator iter2=pregunta.getOpcionPreguntas().iterator(); iter2.hasNext(); ) {
					OpcionPregunta opcionPregunta = (OpcionPregunta)iter2.next();					
					CheckBox checkBox = new CheckBox(opcionPregunta.getEnunciado());
					RowLayoutData rowLayoutData = new RowLayoutData();
					rowLayoutData.setInsets(new Insets(new Extent(5,Extent.PX), 
													   new Extent(0, Extent.PX), 
													   new Extent(5, Extent.PX),
													   new Extent(0, Extent.PX)));
					checkBox.setLayoutData(rowLayoutData);
					checkBox.setActionCommand(pregunta.getIdPregunta().toString());
					checkBox.addActionListener(this.checkBoxListener);					
					fila.add(checkBox);
					grid.add(fila);
					checkBoxesPregunta.put(opcionPregunta, checkBox);					
				}
				this.widgetsRespuestas.put(pregunta, checkBoxesPregunta);
			}
		}
		
		TabPaneLayoutData columnLayoutData = new TabPaneLayoutData();
		columnLayoutData.setTitle(this.encuesta.getNombre());
		this.setLayoutData(columnLayoutData);
		Column columna = new Column();		
		columna.add(grid);
		
		this.add(columna);
		
	}
	
	public void onInicializar() {
		// TODO Auto-generated method stub
		this.initComponents();
	}

	public void onListaParametros(List listaParametros) {
		// TODO Auto-generated method stub
		
	}

	public void onModificar(Object objeto) {
		// TODO Auto-generated method stub
		
	}

	public void onObjetoEntidad(Object objeto) {
		// TODO Auto-generated method stub
		
	}

	public boolean onValidarDatos(Object objeto, TipoFuncion tipo, String nombre) {
		// TODO Auto-generated method stub
		boolean valido = true;
		String mensaje = "";
		for (Iterator iter=this.widgetsRespuestas.keySet().iterator(); iter.hasNext(); ) {
			Pregunta pregunta = (Pregunta)iter.next();
			if (pregunta.getRespuestaObligatoria().equals(RespuestaCerrada.SI)) {
				if (pregunta.getTipoRespuesta().equals(TipoRespuesta.ALFANUMERICA) &&
					((((TextArea)this.widgetsRespuestas.get(pregunta)).getText() == null) ||
					 (((TextArea)this.widgetsRespuestas.get(pregunta)).getText().trim().equals("")))) {
					valido = false;
					mensaje += "DEBE INGRESAR UN VALOR PARA LA PREGUNTA "+pregunta.getNumero()+" ("+pregunta.getEnunciado()+").<br>";
				}
				else if ((pregunta.getTipoRespuesta().equals(TipoRespuesta.NUMERICA)) &&
						 (((SelectField)this.widgetsRespuestas.get(pregunta)).getSelectedItem() == null)) {
					valido = false;
					mensaje += "SELECCIONE UN VALOR PARA LA PREGUNTA "+pregunta.getNumero()+" ("+pregunta.getEnunciado()+").<br>";
				}
				else if ((pregunta.getTipoRespuesta().equals(TipoRespuesta.SELECCION_SIMPLE)) ||
						 (pregunta.getTipoRespuesta().equals(TipoRespuesta.SELECCION_MULTIPLE))) {
					boolean algunaSeleccion = false;
					for (Iterator iter2=((Map)this.widgetsRespuestas.get(pregunta)).values().iterator(); iter2.hasNext(); ) {
						ToggleButton toggleButton = (ToggleButton)iter2.next();
						if (toggleButton.isSelected()) {
							algunaSeleccion = true;
							break;
						}
					}
					if (!algunaSeleccion) {
						valido = false;
						mensaje += "SELECCIONE UN VALOR PARA LA PREGUNTA "+pregunta.getNumero()+" ("+pregunta.getEnunciado()+").<br>";
					}
				}
			}
		}
		if (!valido) {
			throw new ObeliscoException(mensaje);
		}
		return valido;
	}

	
	// Getter y Setter
	public Encuesta getEncuesta() {
		return encuesta;
	}

	public void setEncuesta(Encuesta encuesta) {
		this.encuesta = encuesta;
	}

	public IServicioAdministracionAplicacionEncuesta getServicioAdministracionAplicacionEncuesta() {
		return servicioAdministracionAplicacionEncuesta;
	}

	public void setServicioAdministracionAplicacionEncuesta(
			IServicioAdministracionAplicacionEncuesta servicioAdministracionAplicacionEncuesta) {
		this.servicioAdministracionAplicacionEncuesta = servicioAdministracionAplicacionEncuesta;
	}


}
